<?php
/**
 * Nweb Framework
 *
 * This script is protected by copyright. It's use, copying, modification
 * and distribution without written consent of the author is prohibited.
 *
 * @category    source
 * @package     pl.nweb.framework.request
 * @author      Krzysztof Kardasz <krzysztof.kardasz@gmail.com>
 * @copyright   Copyright (c) 2011 Krzysztof Kardasz
 * @license     http://www.gnu.org/licenses/lgpl-3.0.txt  GNU Lesser General Public
 * @version     3.0 $Id: request.php 470 2012-01-26 16:02:04Z krzysztof.kardasz $
 * @link        http://code.google.com/p/nweb-framework/
 * @link        http://framework.nweb.pl
 */

namespace pl\nweb\framework;

/**
 * Żądanie
 *
 * @category    source
 * @package     pl.nweb.framework.request
 * @author      Krzysztof Kardasz <krzysztof.kardasz@gmail.com>
 * @copyright   Copyright (c) 2011 Krzysztof Kardasz
 * @version     3.0 $Id: request.php 470 2012-01-26 16:02:04Z krzysztof.kardasz $
 */
class Request
{
    /**
     * Flaga, czy żądanie zostało zrealizowane
     *
     * @var boolean
     */
    private $_dispatched = false;

    /**
     * Flaga, czy żądanie zostało przekierowane
     *
     * @var boolean
     */
    private $_forwarded = false;

    /**
     * Parametry żądania
     *
     * @var array
     */
    protected $_params = array();

    /**
     * Nazwa modułu
     *
     * @var string
     */
    protected $_module = null;

    /**
     * Nazwa kontrolera
     *
     * @var string
     */
    protected $_controller = null;

    /**
     * Nazwa akcji
     *
     * @var string
     */
    protected $_action = null;

    /**
     * Parametry
     */
    const PARAM_MODULE     = 'module';
    const PARAM_CONTROLLER = 'controller';
    const PARAM_ACTION     = 'action';

    /**
     * Konstruktor
     *
     * @param  array $params parametry
     */
    public function __construct (array $params = array())
    {
        if(!empty($params[self::PARAM_MODULE])) {
            $this->setModule($params[self::PARAM_MODULE]);
            unset($params[self::PARAM_MODULE]);
        }

        if(!empty($params[self::PARAM_CONTROLLER])) {
            $this->setController($params[self::PARAM_CONTROLLER]);
            unset($params[self::PARAM_CONTROLLER]);
        }

        if(!empty($params[self::PARAM_ACTION])) {
            $this->setAction($params[self::PARAM_ACTION]);
            unset($params[self::PARAM_ACTION]);
        }

        $this->_params = $params;
    }

    /**
     * Zwraca flagę czy nazwa modułu jest zdefiniowana
     *
     * @return boolean
     */
    public function hasModule ()
    {
        return $this->_module !== null;
    }

    /**
     * Definiowanie nazwy modułu
     *
     * @param string $name nazwa modułu
     * @return void
     */
    public function setModule ($name = null)
    {
        if(!empty($name))
            $this->_module = $name;
    }

    /**
     * Zwraca nazwę modułu
     *
     * @return string|null
     */
    public function getModule ()
    {
        return $this->_module;
    }

    /**
     * Zwraca flagę czy nazwa kontrolera jest zdefiniowana
     *
     * @return boolean
     */
    public function hasController ()
    {
        return $this->_controller !== null;
    }

    /**
     * Definiuje nazwę kontrolera
     *
     * @param string $name nazwa kontrolera
     * @return void
     */
    public function setController ($name)
    {
        if(!empty($name))
            $this->_controller = $name;
    }

    /**
     * Zwraca nazwę kontrolera
     *
     * @return string|boolean
     */
    public function getController ()
    {
        return $this->_controller;
    }

    /**
     * Zwraca flagę czy nazwa akcji jest zdefiniowana
     *
     * @return boolean
     */
    public function hasAction ()
    {
        return $this->_action !== null;
    }

    /**
     * Definiowanie nazwy akcji
     *
     * @param string $name nazwa akcji
     * @return void
     */
    public function setAction ($name)
    {
        if(!empty($name))
            $this->_action = $name;
    }

    /**
     * Zwraca nazwę akcji
     *
     * @return string|null
     */
    public function getAction ()
    {
        return $this->_action;
    }

    /**
     * Definiuje parametr
     *
     * @param string $name nazwa parametru
     * @param mixed $value wartość parametru
     * @return void
     */
    public function setParam ($key, $value)
    {
        $this->_params[$key] = $value;
    }

    /**
     * Zwraca żądany parametr lub wszystkie parametry
     *
     * @param  null|string $key klucz
     * @param  mixed $default domyślna wartość
     * @return mixed|array
     */
    public function getParam ($key = null, $default = null)
    {
        if(null === $key) {
            return $this->_params;
        }
        if(isset($this->_params[$key])) {
            return $this->_params[$key];
        }
        return $default;
    }

    /**
     * Zwraca flagę, czy żądanie zostało zrelizowane
     *
     * @return boolean
     */
    public function isDispatched ()
    {
        return $this->_dispatched;
    }

    /**
     * Definiowanie flagi, czy żądanie zostało zrealizowane
     *
     * @param  boolean $flag flaga
     * @return void
     */
    public function setDispatched ($flag)
    {
        $this->_dispatched = (boolean)$flag;
    }

    /**
     * Zwraca flagę, czy żądanie zostało przekierowane
     *
     * @return boolean
     */
    public function isForwarded ()
    {
        return $this->_forwarded;
    }

    /**
     * Definiowanie flagi, czy żądanie zostało przekierowane
     *
     * @param  boolean $flag flaga
     * @return void
     */
    public function setForwarded ($flag)
    {
        $this->_forwarded = (boolean)$flag;
    }
}